import axios from 'axios'
import notification from '@jxstjh/ant-design-vue/lib/notification'
import message from '@jxstjh/ant-design-vue/lib/message'
import {
  VueAxios
} from './axios'
import {
  ACCESS_TOKEN
} from '@/store/mutation-types'


const localBaseUrl = [process.env.VUE_APP_API_BASE_URL_MODULE, process.env.VUE_APP_API_BASE_URL]

// url中是否包含baseUrl
const hasBaseUrl = (url) => localBaseUrl.some(item => ~url.indexOf(item))

const requestIsFormPortal = (request) => {
  if (request['url'] && request['url'].indexOf('http://') === -1 && request['url'].indexOf('https://') === -1) {
    return true
  } else {
    return false
  }
}

const CODEMESSAGE = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。'
}
/* 判断是否是平台的请求
 * return true false
 */
export const requestIsPortal = (request = {}) => {
  if (request['responseURL']) {
    return hasBaseUrl(request['responseURL'])
  } else {
    return false
  }
}
const sucessCode = [0, 200]
const handleData = ({
                      config,
                      data,
                      headers,
                      request,
                      status,
                      statusText
                    }) => {
  if (status === 200) {
    // 兼容 0 和 200 的code
    if (data && data.code && sucessCode.indexOf(data.code) === -1) {
      message.error(data.msg || data.message)
    }
    if (data.code === 401) {
      // redirectSSOLogin()
    }
  } else if (status === 401) {
    // redirectSSOLogin()
  } else {
    notification.error({
      message: '提示',
      description: data.statusText || CODEMESSAGE[status] || data && data.msg
    })
  }
}

// 创建 axios 实例
const request = axios.create({
  // API 请求的默认前缀   移动至请求拦截其中添加
  // baseURL: process.env.VUE_APP_API_BASE_URL,
  // baseURL: 'http://10.36.6.3:30405/manage/',
  timeout: 12000 // 请求超时时间
})

// 异常拦截处理器
const errorHandler = (error) => {
  // 如果不是平台的请求 则不弹出提示
  if (!requestIsPortal(error.response && error.response.request)) {
    return Promise.reject(error)
  }
  if (error.response) {
    const data = error.response.data
    // 从 localstorage 获取 token
    // const token = sessionStorage.getItem(ACCESS_TOKEN)
    if (error.response.status === 403 || error.response.status === 500) {
      notification.error({
        message: '提示',
        description: data.msg || data.message || data.error
      })
    }
    // token是否失效，后台约定失效返回401
    if (error.response.status === 401) {
      // redirectSSOLogin()
    }
  } else {
    notification.error({
      message: '提示',
      description: '服务器未响应，请刷新重试'
    })
  }
  return Promise.reject(error)
}

// request interceptor
request.interceptors.request.use(config => {
  const token = sessionStorage.getItem(ACCESS_TOKEN)
  // 如果是门户域名，就加上token
  if (requestIsFormPortal(config)) {
    config.headers[ACCESS_TOKEN] = token || ''
    //  portal-source：业务平台代理标识符
    if (~config.url.indexOf('portal-source')) {
      config.url = config.url.replace('portal-source', process.env.VUE_APP_API_PORTAL_SOURCE)
    } else if (!hasBaseUrl(config.url)) { // 如果没有设置过baseUrl就添加默认的baseUrl
      config.url = process.env.VUE_APP_API_BASE_URL + config.url
    }
  }
  return config
}, errorHandler)

// response interceptor
request.interceptors.response.use((response, e) => {
  if (requestIsPortal(response.request)) {
    handleData(response)
  }
  return response.data
}, errorHandler)

const installer = {
  vm: {},
  install (Vue) {
    Vue.use(VueAxios, request)
  }
}

export default request

export {
  installer as VueAxios,
  request as axios
}
